package golang

import "gitee.com/allowall-package/goutil/fn"

// 被适配的接口
type Adaptee interface {
	Res() string
}

// 被适配的某个类A
type AdapteeA struct{}

// 被适配的某个类A 实现自己的方法
func (a *AdapteeA) Res() string {
	return "AdapteeARes"
}

// 实例化被适配的某个类A
func NewAdapteeA() *AdapteeA {
	return &AdapteeA{}
}

// ---------------分割线---------------

// 适配之后的目标接口
type Target interface {
	Result() string
}

// 适配器类，需要继承被适配的接口
type adapter struct {
	Adaptee
}

// 实现适配器自己的方法，可以直接调用被继承的方法
func (a *adapter) Result() string {
	return a.Res()
}

// 通过依赖注入，把被适配的类注册到适配器中
func NewAdapter(a Adaptee) Target {
	return &adapter{Adaptee: a}
}

// ---------------分割线---------------

// 测试方法
func AdapterTest() {
	a := NewAdapteeA()
	fn.Dump(fn.FuncInfo(), NewAdapter(a).Result())
}
